home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / endo / parseargs.c < prev    next >
C/C++ Source or Header  |  1995-05-12  |  21KB  |  772 lines

  1. /*************************************************************************
  2.  *                                                                       *
  3.  *  Copyright (c) 1992, 1993 Ronald Joe Record                           *
  4.  *                                                                       *
  5.  *  All rights reserved. No part of this program or publication may be   *
  6.  *  reproduced, transmitted, transcribed, stored in a retrieval system,  *
  7.  *  or translated into any language or computer language, in any form or *
  8.  *  by any means, electronic, mechanical, magnetic, optical, chemical,   *
  9.  *  biological, or otherwise, without the prior written permission of:   *
  10.  *                                                                       *
  11.  *      Ronald Joe Record (408) 458-3718                                 *
  12.  *      212 Owen St., Santa Cruz, California 95062 USA                   *
  13.  *                                                                       *
  14.  *************************************************************************/
  15.  
  16. #include <math.h>
  17. #include <stdio.h>
  18. #ifndef NeXT
  19. #include <values.h>
  20. #endif
  21. #include "x.h"
  22. #include "params.h"
  23.  
  24. void
  25. parseargs(ac, av)
  26. int ac;
  27. char **av;
  28. {
  29.     static int c;
  30.     extern short delay;
  31.     extern int optind, color_offset, demo, negative, maxcrit, use_avg_lyap;
  32.     extern int therm_index, reverse_video;
  33.     extern double therm_min, therm_max;
  34.     extern char *optarg;
  35.     extern double atof();
  36.     extern void usage();
  37.  
  38.     map = Maps[0];
  39.     deriv = Derivs[0];
  40.     setparams(0);
  41.     therm_index = 0;
  42.     therm_min = pmins[0][0];
  43.     therm_max = pmaxs[0][0];
  44.     
  45.     maxperiod=0; minperiod= MAXINT;
  46.  
  47.     while ((c=getopt(ac,av, "^/+012345678:9:RUVZpquvP:T:A:B:C:D:E:F:G:I:J:K:L:M:N:Q:W:X:Y:H:O:S:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:r:s:t:w:x:y:z:"))!=EOF){
  48.         switch (c) {
  49.         case '^':    negative=(!negative); break;
  50.         case '/':    reverse_video=(!reverse_video); break;
  51.         case '+':    axes=(!axes); break; /* overlay plot of axes */
  52.         case '0':    demo=1; break;
  53.         case '1':    orbits_1d=1; break; /* y bifurcation diagram */
  54.         case '2':    orbits_1d=2; break; /* both bifurcation diag */
  55. #ifdef USE_3D
  56.         case '3':    orbits_3d=1; break;
  57. #endif
  58.         case '4':    orbits_1d=3; break; /* x bifurcation diagram */
  59.         case '6':    animate=1; break; /* draw animation style */
  60.         case '7':    histogram=1; break; /* draw histogram style */
  61.         case '8':    lyap=atoi(optarg); 
  62.                 if (lyap == 5) {
  63.                     calclyap = 1; 
  64.                     if (!find)
  65.                         find = 2;
  66.                     lyap = 0;
  67.                 }
  68.                 break;
  69.                 /* 0 = no Lyapunov sets */
  70.                 /* 1 = bifurcation diagrams only */
  71.                 /* 2 = bifurcation and Lyapunov sets */
  72.                 /* 3 = 2 but IC = last pt on attractor */
  73.                 /* 4 = 2 but IC = critical point */
  74.                 /* 5 = 0 but calculate lyapunov exponent */
  75.         case '9':    mandel=atoi(optarg);
  76.                 break;
  77.                 /* 0 = no Mandelbrot/Julia sets */
  78.                 /* 1 = Mandelbrot with Lyapunov exponents */
  79.                 /* 2 = Mandelbrot in black */
  80.                 /* 3 = Rate of Attraction of critical point */
  81.                 /* 4 = Use [STARTCOLOR,MINCOLINDEX] for escapees */
  82.         case 'A':    params[0]=atof(optarg); Aflag++; break;
  83.         case 'B':    params[1]=atof(optarg); Bflag++; break;
  84.         case 'C':    params[2]=atof(optarg); Cflag++; break;
  85.         case 'D':    params[3]=atof(optarg); Dflag++; break;
  86.         case 'E':    params[4]=atof(optarg); Eflag++; break;
  87.         case 'F':    params[5]=atof(optarg); Fflag++; break;
  88.         case 'G':    params[6]=atof(optarg); Gflag++; break;
  89.         case 'H':    height=atoi(optarg);
  90.                  traheight=criheight=height;
  91.                 if (optind < ac)
  92.                     if (av[optind][0] == ',') {
  93.                         traheight = atoi(av[optind+1]);
  94.                         optind += 2;
  95.                     }
  96.                 if (optind < ac)
  97.                     if (av[optind][0] == ',') {
  98.                         criheight = atoi(av[optind+1]);
  99.                         optind += 2;
  100.                     }
  101.                 break;
  102.         case 'I':    params[7]=atof(optarg); Iflag++; break;
  103.         case 'J':    params[8]=atof(optarg); Jflag++; break;
  104.         case 'K':    params[9]=atof(optarg); Kflag++; break;
  105.         case 'L':    params[10]=atof(optarg); Lflag++; break;
  106.         case 'M':    params[11]=atof(optarg); Mflag++; break;
  107.         case 'N':    MINCOLINDEX=atoi(optarg); 
  108.                 if ((MINCOLINDEX - STARTCOLOR) <= 0) {
  109.                   printf("An argument of -N %d ",MINCOLINDEX);
  110.                   printf("indicates to set the minimum");
  111.                   printf("color index to %d\n",MINCOLINDEX);
  112.                   printf("Currently, the compiled value for");
  113.                   printf("STARTCOLOR is %d\n",STARTCOLOR);
  114.                   printf("The minimum color index must be greater\n");
  115.                   exit(-1);
  116.                 }
  117.                 break;
  118.         case 'O':    color_offset=atoi(optarg); break;
  119.         case 'P':    critical=atoi(optarg); 
  120.                 if (critical == 1) { /* critical curves only */
  121.                     critical = 1;
  122.                     precrit = 0;
  123.                 }
  124.                 else if (critical == 2) { /* plus precritical */
  125.                     critical = 1;
  126.                     precrit = 1;
  127.                 }
  128.                 else if (critical == 3) { /* precrit only */
  129.                     critical = 0;
  130.                     precrit = 1;
  131.                 }
  132.                 else if (critical == 4) { /* pre-images of */
  133.                     precrit = 2;     /* the diagonal only */
  134.                     critical = 0;
  135.                 }
  136.                 else if (critical == 5) { /*attractors divide */
  137.                     precrit = 3;     /* across diagonal */
  138.                     critical = 0;
  139.                 }
  140.                 else if (critical == 6) { /* pre-images of */
  141.                     precrit = 4;     /* the origin only */
  142.                     critical = 0;
  143.                 }
  144.                 else if (critical == 7) { /* pre-images of */
  145.                     precrit = 5;     /* diagonal + origin */
  146.                     critical = 0; /*color origin different*/
  147.                 }
  148.                 else if (critical == 8) { /* pre-images of */
  149.                     precrit = 6;     /* critical + origin */
  150.                     critical = 0; /*color origin different*/
  151.                 }
  152.                 else if (critical == 9) { /*attractors divide */
  153.                     precrit = 7;     /* across y-axis */
  154.                     critical = 0;
  155.                 }
  156.                 else if (critical == 10) {/*attractors divide */
  157.                     precrit = 8;     /* across x-axis */
  158.                     critical = 0;
  159.                 }
  160.                 else if (critical == 11) {/*rate of attraction*/
  161.                     precrit = 9; /* colored according to */
  162.                     critical = 0; /* distance from (0,0) */
  163.                 }
  164.                 else if (critical == 12) {/*rate of attraction*/
  165.                     precrit = 10; /* colored according to */
  166.                     critical = 0; /* angle with x-axis */
  167.                 }
  168.                 else if (critical == 13) {/*attractors divide */
  169.                     precrit = 11; /* across x and y axes  */
  170.                     critical = 0;
  171.                 }
  172.                 break;
  173.         case 'Q':    p1 = atoi(optarg);
  174.                 if (optind < ac)
  175.                     p2 = atoi(av[optind++]); 
  176.                 else
  177.                     usage();
  178.                 if (optind < ac)
  179.                     if (av[optind][0] == ',') {
  180.                         Qflag = atoi(av[optind+1]);
  181.                         optind += 2;
  182.                     }
  183.                 break;
  184.         case 'R':    randinit++; break;
  185.         case 'S':    settle=atoi(optarg);
  186.                 if (optind < ac)
  187.                     if (av[optind][0] == ',') {
  188.                         maxcrit = atoi(av[optind+1]);
  189.                         optind += 2;
  190.                     }
  191.                 break;
  192.         case 'T':    mapindex=atoi(optarg);
  193.                 if ((mapindex >= NUMMAPS) || (mapindex < 0))
  194.                     usage();
  195.                 map = Maps[mapindex];
  196.                 if (numeric)
  197.                     deriv = dnumeric;
  198.                 else
  199.                     deriv = Derivs[mapindex];
  200.                 if (optind < ac)
  201.                     if (av[optind][0] == ',') {
  202.                         model_1d = atoi(av[optind+1]) % 2;
  203.                         optind += 2;
  204.                     }
  205.                 setparams(mapindex);
  206.                 break;
  207.         case 'U':    lower = 0; break;
  208.         case 'V':    find = 1; break;
  209.         case 'W':    width=trawidth=criwidth=atoi(optarg);
  210.                 if (optind < ac)
  211.                     if (av[optind][0] == ',') {
  212.                         trawidth = atoi(av[optind+1]);
  213.                         optind += 2;
  214.                     }
  215.                 if (optind < ac)
  216.                     if (av[optind][0] == ',') {
  217.                         criwidth = atoi(av[optind+1]);
  218.                         optind += 2;
  219.                     }
  220.                 break;
  221.         case 'X':    start_x=atof(optarg); Xflag++; break;
  222.         case 'Y':    start_y=atof(optarg); Yflag++; break;
  223.         case 'Z':    upper = 0; break;
  224.         case 'a':    params[12]=atof(optarg); aflag++; break;
  225.         case 'b':    params[13]=atof(optarg); bflag++; break;
  226.         case 'c':    params[14]=atof(optarg); cflag++; break;
  227.         case 'd':    if (strcmp(optarg, "elay")) {
  228.                         params[15]=atof(optarg);
  229.                         dflag++;
  230.                     }
  231.                     else
  232.                         delay = atoi(av[optind++]);
  233.                     break;
  234.         case 'e':    params[16]=atof(optarg); eflag++; break;
  235.         case 'f':    params[17]=atof(optarg); fflag++; break;
  236.         case 'g':    params[18]=atof(optarg); gflag++; break;
  237.         case 'h':       y_range=atof(optarg); hflag++;
  238.                 if (optind < ac)
  239.                     if (av[optind][0] == ',') {
  240.                         t_y_range = atof(av[optind+1]);
  241.                         hflag++;
  242.                         optind += 2;
  243.                     }
  244.                 if (optind < ac)
  245.                     if (av[optind][0] == ',') {
  246.                         c_y_range = atof(av[optind+1]);
  247.                         hflag++;
  248.                         optind += 2;
  249.                     }
  250.                 break;
  251.         case 'i':    params[19]=atof(optarg); iflag++; break;
  252.         case 'j':    params[20]=atof(optarg); jflag++; break;
  253.         case 'k':    params[21]=atof(optarg); kflag++; break;
  254.         case 'l':    params[22]=atof(optarg); lflag++; break;
  255.         case 'm':    params[23]=atof(optarg); mflag++; break;
  256.         case 'n':    if (strcmp(optarg, "umeric"))
  257.                         if (strcmp(optarg, "umwheel"))
  258.                             dwell=atoi(optarg);
  259.                         else {
  260.                             numwheels = atoi(av[optind]);
  261.                             optind++;
  262.                         }
  263.                     else
  264.                         numeric=1; 
  265.                     break;
  266.         case 'o':    savefile++; outname=optarg;
  267.                 if (optind < ac)
  268.                     if (av[optind][0] == ',') {
  269.                         savefile = atoi(av[optind+1]);
  270.                         optind += 2;
  271.                     }
  272.                 break;
  273.         case 'p':    portrait = 0; break;
  274.         case 'q':    use_avg_lyap = 0; break;
  275.         case 'r':    maxradius=atoi(optarg); break;
  276.         case 's':    spinlength=atoi(optarg); break;
  277.         case 't':    if (strcmp(optarg, "herm"))
  278.                         delta=atof(optarg);
  279.                     else {
  280.                         therm_index = atoi(av[optind++]);
  281.                         if (therm_index == -1)
  282.                             thermometer = !thermometer;
  283.                         if (optind < ac)
  284.                             if (av[optind][0] == ',') {
  285.                                 therm_min = atof(av[optind+1]);
  286.                                 optind += 2;
  287.                             }
  288.                         if (optind < ac)
  289.                             if (av[optind][0] == ',') {
  290.                                 therm_max = atof(av[optind+1]);
  291.                                 optind += 2;
  292.                             }
  293.                     }
  294.                     break;
  295.         case 'u':    usage(); break;
  296.         case 'v':    show=1; break;
  297.         case 'w':       x_range=atof(optarg); wflag++;
  298.                 if (optind < ac)
  299.                     if (av[optind][0] == ',') {
  300.                         t_x_range = atof(av[optind+1]);
  301.                         wflag++;
  302.                         optind += 2;
  303.                     }
  304.                 if (optind < ac)
  305.                     if (av[optind][0] == ',') {
  306.                         c_x_range = atof(av[optind+1]);
  307.                         wflag++;
  308.                         optind += 2;
  309.                     }
  310.                 break;
  311.         case 'x':       min_x=atof(optarg); xflag++;
  312.                 if (optind < ac)
  313.                     if (av[optind][0] == ',') {
  314.                         t_min_x = atof(av[optind+1]);
  315.                         xflag++;
  316.                         optind += 2;
  317.                     }
  318.                 if (optind < ac)
  319.                     if (av[optind][0] == ',') {
  320.                         c_min_x = atof(av[optind+1]);
  321.                         xflag++;
  322.                         optind += 2;
  323.                     }
  324.                 break;
  325.         case 'y':       min_y=atof(optarg); yflag++;
  326.                 if (optind < ac)
  327.                     if (av[optind][0] == ',') {
  328.                         t_min_y = atof(av[optind+1]);
  329.                         yflag++;
  330.                         optind += 2;
  331.                     }
  332.                 if (optind < ac)
  333.                     if (av[optind][0] == ',') {
  334.                         c_min_y = atof(av[optind+1]);
  335.                         yflag++;
  336.                         optind += 2;
  337.                     }
  338.                 break;
  339.         case 'z':    cdelt=atof(optarg); break;
  340.         case '?':    usage(); break;
  341.         }
  342.     }
  343.     if (numeric)
  344.         deriv = dnumeric;
  345.     else
  346.         deriv = Derivs[mapindex];
  347.     max_x = min_x + x_range;
  348.     max_y = min_y + y_range;
  349.     a_minimums[0] = min_x; b_minimums[0] = min_y;
  350.     a_maximums[0] = max_x; b_maximums[0] = max_y;
  351.     reset_params();
  352. }
  353.  
  354. #ifdef NorthSouth
  355.  
  356. void
  357. calc_domain()
  358. {
  359.     static double tmp1, tmp2, tmp3;
  360.  
  361.     tmp3 = A_one - 1.0;
  362.     tmp1 = -tmp3/(2.0*A_two);
  363.     tmp2 = (1.0/(2.0*A_two))*sqrt((tmp3*tmp3) - (4.0*A_zero*A_two));
  364.      B_zero = tmp1 + tmp2;
  365.      O_B_zero = tmp1 - tmp2;
  366.     B_one = (-A_one / A_two) - (2.0 * B_zero);
  367.     O_B_one = (-A_one / A_two) - (2.0 * O_B_zero);
  368.     tmp3 = S_A_one - 1.0;
  369.     tmp1 = -tmp3/(2.0*S_A_two);
  370.     tmp2 = (1.0/(2.0*S_A_two))*sqrt((tmp3*tmp3) - (4.0*S_A_zero*S_A_two));
  371.     S_B_zero = tmp1 + tmp2;
  372.     O_S_B_zero = tmp1 - tmp2;
  373.     S_B_one = (-S_A_one / S_A_two) - (2.0 * S_B_zero);
  374.     O_S_B_one = (-S_A_one / S_A_two) - (2.0 * O_S_B_zero);
  375.     if (B_one < 0) {
  376.         B_zero = B_zero + B_one;
  377.         B_one = -B_one;
  378.     }
  379.     if (O_B_one < 0) {
  380.         O_B_zero = O_B_zero + O_B_one;
  381.         O_B_one = -O_B_one;
  382.     }
  383.     if (S_B_one < 0) {
  384.         S_B_zero = S_B_zero + S_B_one;
  385.         S_B_one = -S_B_one;
  386.     }
  387.     if (O_S_B_one < 0) {
  388.         O_S_B_zero = O_S_B_zero + O_S_B_one;
  389.         O_S_B_one = -O_S_B_one;
  390.     }
  391.     if (lyap) {
  392.         if (!Xflag)
  393.             start_x = (-1.0*A_one)/(2.0*A_two); /* the critical point */
  394.         if (!Yflag)
  395.           if (model_1d)
  396.             start_y = H_zero + (H_one * start_x);
  397.           else
  398.             start_y = (-1.0*S_A_one)/(2.0*S_A_two);
  399.     }
  400.     else {
  401.         if ((singularity > B_zero) && (singularity < (B_zero+B_one))) {
  402.             if (!wflag)
  403.                 x_range = B_one - (singularity - B_zero);
  404.             if (!xflag)
  405.                 min_x = singularity;
  406.         }
  407.         else {
  408.             if (!xflag)
  409.                 min_x = B_zero; 
  410.             if (!wflag)
  411.                 x_range = B_one;
  412.         }
  413.         max_x = min_x + x_range; 
  414.         if ((S_singularity > S_B_zero) &&
  415.             (S_singularity < (S_B_zero+S_B_one))) {
  416.             if (!hflag)
  417.                 y_range = S_B_one - (S_singularity - S_B_zero);
  418.             if (!yflag)
  419.                 min_y = S_singularity;
  420.         }
  421.         else {
  422.             if (!yflag)
  423.                 min_y = S_B_zero;
  424.             if (!hflag)
  425.                 y_range = S_B_one;
  426.         }
  427.         if ((model_1d) && (!yflag) && (!hflag)) {
  428.             max_y = H_zero + (H_one * max_x);
  429.             min_y = H_zero + (H_one * min_x);
  430.             y_range = max_y - min_y;
  431.         }
  432.         a_minimums[frame] = min_x; b_minimums[frame] = min_y;
  433.         a_maximums[frame] = max_x; b_maximums[frame] = max_y;
  434.     }
  435. }
  436.  
  437. void
  438. calculate_params(map, p)
  439. int map;
  440. double *p;
  441. {
  442.     static double tmp1, tmp2, tmp3, tmp4;
  443.  
  444.     params[6] = (params[2]*params[5]) - (params[3]*params[4]);
  445.     params[18] = (params[14]*params[17]) - (params[15]*params[16]);
  446.     if (map == 7) {    /* North-South model */
  447.         tmp1 = p[13] / p[21];
  448.         tmp2 = 1.0 + (p[17] * p[19] / p[22]);
  449.         tmp3 = p[20]+(p[21]*p[17]/p[18]); /* North coefficients */
  450.         A_zero = (tmp1*tmp2*tmp3) - (p[13]*p[15]*p[15]*p[16]);
  451.         tmp1 = (1.0-p[12]);
  452.         tmp2 = p[13] / p[22];
  453.         tmp3 = p[20] + (p[21]*p[17]/p[18]);
  454.         A_one = tmp1 + (tmp2 * (-p[19] - ((p[17]/p[15]) * tmp3)));
  455.         A_two = p[13] / p[22];
  456.         A_star = -(p[13]*p[16]*p[16]*p[15]*p[22]/p[18]);
  457.         singularity = p[19] + (p[14] * p[22] / p[18]);
  458.         H_one = (p[10] * p[3] * p[18]) / (p[22] * p[15] * p[6]);
  459.         H_zero=((p[10]/p[6])*(p[2]-(p[14]*p[3]/p[15])))-(H_one*p[19])+p[7];
  460.         /* South quadratic coefficients and singularity */
  461.         S_A_zero = H_zero + (H_one * A_zero) - (A_one * H_zero) +
  462.                     (A_two * H_zero * H_zero / H_one);
  463.         S_A_one = A_one - (2.0 * A_two * H_zero / H_one);
  464.         S_A_two = A_two / H_one;
  465.         S_A_star = H_one * H_one * A_star;
  466.         S_singularity = H_zero + (H_one * singularity);
  467.         calc_domain();
  468.     }
  469. }
  470. #endif /* NorthSouth */
  471.  
  472. setparams(map)
  473. int map;
  474. {
  475.     extern double therm_min, therm_max;
  476.  
  477.     if (!Aflag)
  478.         params[0] = defparms[map][0];
  479.     if (!Bflag)
  480.         params[1] = defparms[map][1];
  481.     if (!Cflag)
  482.         params[2] = defparms[map][2];
  483.     if (!Dflag)
  484.         params[3] = defparms[map][3];
  485.     if (!Eflag)
  486.         params[4] = defparms[map][4];
  487.     if (!Fflag)
  488.         params[5] = defparms[map][5];
  489.     if (!Gflag)
  490.         params[6] = defparms[map][6];
  491.     if (!Iflag)
  492.         params[7] = defparms[map][7];
  493.     if (!Jflag)
  494.         params[8] = defparms[map][8];
  495.     if (!Kflag)
  496.         params[9] = defparms[map][9];
  497.     if (!Lflag)
  498.         params[10] = defparms[map][10];
  499.     if (!Mflag)
  500.         params[11] = defparms[map][11];
  501.     if (!aflag)
  502.         params[12] = defparms[map][12];
  503.     if (!bflag)
  504.         params[13] = defparms[map][13];
  505.     if (!cflag)
  506.         params[14] = defparms[map][14];
  507.     if (!dflag)
  508.         params[15] = defparms[map][15];
  509.     if (!eflag)
  510.         params[16] = defparms[map][16];
  511.     if (!fflag)
  512.         params[17] = defparms[map][17];
  513.     if (!gflag)
  514.         params[18] = defparms[map][18];
  515.     if (!iflag)
  516.         params[19] = defparms[map][19];
  517.     if (!jflag)
  518.         params[20] = defparms[map][20];
  519.     if (!kflag)
  520.         params[21] = defparms[map][21];
  521.     if (!lflag)
  522.         params[22] = defparms[map][22];
  523.     if (!mflag)
  524.         params[23] = defparms[map][23];
  525.     if (!xflag)
  526.         min_x = amins[map];
  527.     if (!wflag)
  528.         x_range = aranges[map];
  529.     if (!yflag)
  530.         min_y = bmins[map];
  531.     if (!hflag)
  532.         y_range = branges[map];
  533.     max_x = min_x + x_range;
  534.     max_y = min_y + y_range;
  535.     a_minimums[frame] = min_x; b_minimums[frame] = min_y;
  536.     a_maximums[frame] = max_x; b_maximums[frame] = max_y;
  537.     if (lyap) {
  538.         params[p1] = pmins[map][p1];
  539.         params[p2] = pmins[map][p2];
  540.         if (!xflag)
  541.             min_x = pmins[map][p1];
  542.         if (!yflag)
  543.             min_y = pmins[map][p2];
  544.         if (!wflag)
  545.             max_x = pmaxs[map][p1];
  546.         if (!hflag)
  547.             max_y = pmaxs[map][p2];
  548.         x_range = max_x - min_x;
  549.         y_range = max_y - min_y;
  550.         if (thermometer) {
  551.             therm_min = min_x;
  552.             therm_max = max_x;
  553.         }
  554.         a_minimums[frame] = min_x; b_minimums[frame] = min_y;
  555.         a_maximums[frame] = max_x; b_maximums[frame] = max_y;
  556.     }
  557. #ifdef NorthSouth
  558.     if (map == 7)
  559.         calculate_params(map, params);
  560.     else {
  561. #endif
  562.         if (!Xflag)
  563.             start_x = definit[map][0];
  564.         if (!Yflag)
  565.             start_y = definit[map][1];
  566. #ifdef NorthSouth
  567.     }
  568. #endif
  569. }
  570.  
  571. reset_params()
  572. {
  573.     extern int found_arc;
  574.  
  575.     if (mapindex >= 0)
  576.         setparams(mapindex);
  577.     x_inc = x_range / (double)width;
  578.     y_inc = y_range / (double)height;
  579.     point.x = 0; point.y = 0;
  580.     maxexp = minexp = 0;
  581.     run = 1;
  582.     x = min_x; y = min_y;
  583.     numcrits = 0; numarcs = 0; perind[frame] = 0; found_arc = 0;
  584.     if (xflag < 2)
  585.         t_min_x = min_x;
  586.     if (yflag < 2)
  587.         t_min_y = min_y;
  588.     if (xflag < 3)
  589.         c_min_x = min_x;
  590.     if (yflag < 3)
  591.         c_min_y = min_y;
  592.     if (wflag < 2)
  593.         t_x_range = x_range;
  594.     if (hflag < 2)
  595.         t_y_range = y_range;
  596.     if (wflag < 3)
  597.         c_x_range = x_range;
  598.     if (hflag < 3)
  599.         c_y_range = y_range;
  600. }
  601.  
  602. Save_Parms(state)
  603. int state;
  604. {
  605.     static int C, F, P, S, n, Q0, Q1, Q2, T, TW, TH, W, H, nw, a, h, L, i;
  606.     static double x0, x1, w0, w1, y0, y1, h0, h1, tmp_params[MAXPARAMS];
  607.  
  608.     freemem(); 
  609.     if (state) {
  610.         for (i=0; i<MAXPARAMS; i++)
  611.             tmp_params[i] = params[i];
  612.         C = critical; P = portrait; S = settle; L = lyap; F = find;
  613.         n = dwell; 
  614.         Q0 = p1; Q1 = p2; Q2 = Qflag;
  615.         x0 = min_x; x1 = t_min_x; 
  616.         w0 = x_range; w1 = t_x_range; 
  617.         y0 = min_y; y1 = t_min_y; 
  618.         h0 = y_range; h1 = t_y_range; 
  619.         W = width; H = height; 
  620.         T = thermometer; thermometer = 0;
  621.         TW = trawidth; TH = traheight; 
  622.         nw = numwheels; a = animate; h = histogram;
  623.     }
  624.     else {
  625.         for (i=0; i<MAXPARAMS; i++)
  626.             params[i] = tmp_params[i];
  627.         map = Maps[mapindex]; 
  628.         if (numeric)
  629.             deriv = dnumeric;
  630.         else
  631.             deriv = Derivs[mapindex];
  632.         settle = S; dwell = n; Qflag = Q2;
  633.         p1 = Q0; p2 = Q1;
  634.         lyap = L; critical = C; find = F; portrait = P;
  635.         min_x = x0; t_min_x = x1; x_range = w0; t_x_range = w1;
  636.         min_y = y0; t_min_y = y1; y_range = h0; t_y_range = h1;
  637.         width = criwidth = W; 
  638.         height = criheight = H;
  639.         thermometer = T;
  640.         trawidth = TW; 
  641.         traheight = TH;
  642.         numwheels = nw; animate = a; histogram = h;
  643.         xflag = yflag = wflag = hflag = 0;
  644.         reset_params();
  645.     }
  646.     setupmem();
  647. }
  648.  
  649. void
  650. Change_Parms(num)
  651. int num;
  652. {
  653.     extern long lrand48();
  654.     extern double drand48();
  655.  
  656.     if (histogram)
  657.         FreeHist();
  658.     AllInitBuffer();
  659.     run = 1; settle = DEMO_SETTLE; dwell = DEMO_DWELL;
  660.     animate = lrand48() % 2;
  661.     if (animate) 
  662.         clearflag = 0;
  663.     else
  664.         clearflag = lrand48() % 2;
  665.     lyap = 1; find = critical = 0; portrait = 1;
  666.     histogram = orbits_1d = precrit = 0;
  667.     if (XDisplayWidth(dpy, screen) < 800) {
  668.         width = DEMO_16_WIDTH; trawidth = DEMO_16_WIDTH; 
  669.         height = DEMO_16_HEIGHT; traheight = DEMO_16_WIDTH;
  670.     }
  671.     else {
  672.         width = DEMO_WIDTH; trawidth = DEMO_WIDTH; 
  673.         height = DEMO_HEIGHT; traheight = DEMO_WIDTH;
  674.     }
  675.     xflag = yflag = wflag = hflag = 2;
  676.     mapindex = 8 + MAP_OFF; 
  677.     p1 = 0; p2 = 1; Qflag = 0;
  678.     if (num == 0) {
  679.         min_x = 5.175781; t_min_x = -1.303307;
  680.         x_range = 1.289063; t_x_range = 2.664537;
  681.         y_range = 0.433594; t_y_range = 3.642277;
  682.         min_y = 1.082031; t_min_y = -1.375339;
  683.     }
  684.     else if (num == 1) {
  685.         mapindex = 9+MAP_OFF; Qflag = lrand48() % 4; clearflag = 0;
  686.         animate = 1;
  687.           min_x = (drand48()/2.0) + 0.2; t_min_x = 0.0; t_x_range = 1.0;
  688.           min_y = (drand48()/2.0) + 0.2; t_min_y = 0.0; t_y_range = 1.0;
  689.         x_range = 1.0 - min_x; y_range = 1.0 - min_y;
  690.     }
  691.     else if (num == 2) {
  692.           min_x = 6.0; t_min_x = -1.617188;
  693.           x_range = 6.0; t_x_range = 3.328126;
  694.           y_range = 1.0; t_y_range = 5.478515;
  695.           min_y = 2.0; t_min_y = -1.597656;
  696.     }
  697.     else if (num == 3) {
  698.         mapindex = 2+MAP_OFF; 
  699.         p1 = 8; p2 = 10; Qflag = 3;
  700.           min_x = 0.0; t_min_x = 0.0;
  701.           x_range = 1.0; t_x_range = 1.0;
  702.           y_range = 1.0; t_y_range = 1.0;
  703.           min_y = 0.0; t_min_y = 0.0;
  704.     }
  705.     else if (num == 4) {
  706.         p1 = 1; p2 = 0;
  707.           min_x = 0.465057; t_min_x = -1.556885;
  708.           x_range = 2.390259; t_x_range = 3.155823;
  709.           y_range = 6.869888; t_y_range = 8.365632;
  710.           min_y = 6.621113; t_min_y = -2.969666;
  711.     }
  712.     else if (num == 5) {
  713.         mapindex = 9+MAP_OFF; 
  714.         histogram = 1; animate = 0;
  715.           min_x = 0.660602; t_min_x = 0.491563;
  716.           x_range = 0.064783; t_x_range = 0.548026;
  717.           y_range = 0.01; t_y_range = 0.825685;
  718.           min_y = 0.638281; t_min_y = 0.044144;
  719.     }
  720.     else if (num == 6) {
  721.           min_x = 114.988281; t_min_x = -25.442434;
  722.           x_range = 22.841563; t_x_range = 51.060763;
  723.           y_range = 17.1875; t_y_range = 95.178377;
  724.           min_y = 37.742; t_min_y = -20.741033;
  725.     }
  726.     else if (num == 7) {
  727.           min_x = 131.0; t_min_x = -25.44325;
  728.           x_range = 2.0; t_x_range = 51.06325;
  729.           y_range = 0.22; t_y_range = 92.178;
  730.           min_y = 36.65; t_min_y = -20.741;
  731.     }
  732.     else if (num == 8) {
  733.         mapindex = 9+MAP_OFF; 
  734.         histogram = lrand48() % 2;
  735.           min_x = 0.779; t_min_x = 0.0;
  736.           x_range = 0.2053; t_x_range = 1.0;
  737.           if (clearflag)
  738.             y_range = 0.1523; 
  739.         else
  740.             y_range = 0.01; 
  741.         t_y_range = 1.0;
  742.           min_y = 0.418; t_min_y = 0.0;
  743.         orbits_1d = 2; animate = 0;
  744.     }
  745.     else if (num == 9) {
  746.         mapindex = 12+MAP_OFF;
  747.         lyap = 0; histogram = 1; animate = 0;
  748.           min_x = 0.0; t_min_x = -10.0;
  749.           x_range = 1.0; t_x_range = 21.0;
  750.           y_range = 1.0; t_y_range = 21.0;
  751.           min_y = 0.0; t_min_y = -10.0;
  752.         params[0] = (drand48()/10.0) - 0.3; Aflag = 1;
  753.         params[1] = (drand48()/500.0) + 0.007; Bflag = 1;
  754.         params[2] = (drand48()/5.0) - 0.3; Cflag = 1;
  755.     }
  756.     else {
  757.           min_x = 5.8; t_min_x = -1.475;
  758.           x_range = 20.0; t_x_range = 2.984375;
  759.           y_range = 3.0; t_y_range = 4.25;
  760.           min_y = 1.8; t_min_y = -1.509375;
  761.     }
  762.     if (histogram)
  763.         HistoMem();
  764.     map = Maps[mapindex]; 
  765.     if (numeric)
  766.         deriv = dnumeric;
  767.     else
  768.         deriv = Derivs[mapindex];
  769.     reset_params();
  770.     mapindex = -1;
  771. }
  772.